package com.hspedu.qqserver.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;
import com.hspedu.utils.Utility;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @date 2023/03/22/19:03
 */
//实现推送新闻的服务
public class SendNewsToService implements Runnable {
    private boolean isT = true;


    //为了做一个合理对话的退出流程，代码缝缝补补，思路太乱了
    @Override
    public void run() {
        while (true) {//多次推送新闻
            if (isT) {
                System.out.println("请输入服务器要推送的新闻(输入exit退出推送服务)：");
            }
            String news = Utility.readString(100);
            if ("exit".equals(news)) {
                if (isT) {
                    System.out.println("退出推送服务.");
                } else {
                    System.out.println("推送服务已退出,请勿重复输入");
                }
                isT = false;
            }
            if ("start".equals(news)) {
                isT = true;
            }
            if (isT && !"start".equals(news)) {
                Message message = new Message();
                message.setContent(news);
                //这下可省事了。直接当成服务端群发，用了客户群发的消息
                message.setMesType(MessageType.MESSAGE_TO_ALL_MES);
                message.setSender("服务器");
                message.setSendTime(new Date().toString());
                System.out.println("服务器推送消息：" + news);
                //遍历当前所有的通信线程，得到socket，并发送message
                HashMap<String, ServerConnectClientThread> hm = MangerClientThreads.getHm();
                Iterator<String> iterator = hm.keySet().iterator();
                while (iterator.hasNext()) {
                    //得到所有在线用户的id
                    String onLineUserId = iterator.next();
                    try {
                        ObjectOutputStream oos = new ObjectOutputStream(hm.get(onLineUserId).getSocket().getOutputStream());
                        oos.writeObject(message);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

